#include "MyGLWidget.h"
#include <QPainter>
#include <QtOpenGL>

MyGLWidget::MyGLWidget(QWidget *parent) :
    QGLWidget(parent),
    textureID(0)
{
    // 设置格式，可能需要透明度
    QGLFormat format;
    format.setAlpha(true);
    setFormat(format);
}

MyGLWidget::~MyGLWidget()
{
    if (textureID != 0) {
        glDeleteTextures(1, &textureID);
    }
}

void MyGLWidget::initializeGL()
{
    // 设置OpenGL上下文
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // 将清除颜色设置为黑色，alpha为0（完全透明）
    glEnable(GL_TEXTURE_2D);
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // 设置混合函数

    // 加载纹理
    QImage image("path/to/your/transparent.png"); // 请替换为你的PNG图片路径
    if (!image.isNull()) {
        textureID = loadTexture(image);
    }
}

void MyGLWidget::resizeGL(int w, int h)
{
    glViewport(0, 0, w, h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, w, h, 0, -1, 1); // 设置正交投影，使得坐标原点在左上角
    glMatrixMode(GL_MODELVIEW);
}

void MyGLWidget::paintGL()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();

    if (textureID != 0) {
        glBindTexture(GL_TEXTURE_2D, textureID);

        // 设置绘制颜色为白色（保持纹理原始颜色）
        glColor4f(1.0f, 1.0f, 1.0f, 1.0f);

        // 绘制一个四边形，并贴上纹理
        glBegin(GL_QUADS);
        {
            // 假设我们绘制一个200x200的图片，位置在(100,100)
            float x = 100.0f;
            float y = 100.0f;
            float width = 200.0f;
            float height = 200.0f;

            glTexCoord2f(0.0f, 0.0f); glVertex2f(x, y);
            glTexCoord2f(1.0f, 0.0f); glVertex2f(x + width, y);
            glTexCoord2f(1.0f, 1.0f); glVertex2f(x + width, y + height);
            glTexCoord2f(0.0f, 1.0f); glVertex2f(x, y + height);
        }
        glEnd();
    }
}

GLuint MyGLWidget::loadTexture(const QImage &image)
{
    GLuint textureId;
    glGenTextures(1, &textureId);
    glBindTexture(GL_TEXTURE_2D, textureId);

    // 将QImage转换为OpenGL纹理格式
    QImage glImage = QGLWidget::convertToGLFormat(image);

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, glImage.width(), glImage.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, glImage.bits());
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

    return textureId;
}
